/* prekidi.S - osnovni prihvat prekida */
     
#define _ARH_PREKIDI_S_
#include "prekidi.h"

.extern	arh_prekidna_f, arh_stog_aktivne, arh_prekidni_stog

.globl arh_prekidne_funkcije

.section .pocetak_koda

/* svi prekidi dolaze ovdje */

arh_prihvat_prekida:
	movl	arh_stog_aktivne, %ebx
	movl	(%ebx), %ebx    /* sada je ebx adresa kazaljke stoga */
	movl	%esp, (%ebx)
	movl	arh_prekidni_stog, %esp

	pushl   %eax            /* "id" prekida */

	call	*arh_prekidna_f
	
	/* ako je PIC generirao prekid, dozvoli prihvat novih prekida */
	popl	%ebx            /* tu je sad "id" prekida */
	cmp	$PREKIDI_VANJSKI, %ebx
	jb	.1
	cmp	$PREKIDI_PROGRAMSKI, %ebx
	jae	.1
	movb	$PIC_EOI, %al
	outb	%al, $PIC1_CMD
	cmp	$PREKIDI_VANJSKI+7, %ebx
	jbe	.1
	outb	%al, $PIC2_CMD
.1:

	movl	arh_stog_aktivne, %ebx
	movl	(%ebx), %ebx    /* sada je ebx adresa kazaljke stoga */
	movl	(%ebx), %esp

	popal

	addl	$4, %esp	// makni kod greske
	
	iret

/* prekidne funkcije, preko "makroa" ih definiram */

.irp brpr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,\
        26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48

.type prekid_\brpr, @function
prekid_\brpr:

.if \brpr < 8 || \brpr == 9 || \brpr > 14
	pushl   $0	// zamjena za kod greske
.endif

	pushal
	movl	$\brpr, %eax
	jmp	arh_prihvat_prekida
.endr

/* kazaljke na funkcije, potrebne zbog zapisa u IDT (iz C-a) */

.section .data
.align	4
.type	arh_prekidne_funkcije, @object
.size	arh_prekidne_funkcije, 49*4

arh_prekidne_funkcije:
.irp brpr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,\
        26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48

	.long prekid_\brpr
.endr
	.long 0
